#include <iostream>
#include <cerrno>
#include <cstring>
#include <unistd.h>
#include <fcntl.h>

// 设置非阻塞IO函数
bool SetNonBlockIO(int fd)
{
    // 获取文件状态
    int fd_status = fcntl(fd, F_GETFL);
    if(fd_status < 0)
    {
        // 如果失败返回false，表示设置非阻塞失败
        return false;
    }

    // 在原有的文件状态下添加非阻塞状态
    fcntl(fd, F_SETFL, fd_status | O_NONBLOCK);
    return true;
}

int main()
{
    // 对标准输入设置非阻塞
    bool ret = SetNonBlockIO(0);
    if(!ret)
    {
        exit(1);
    }

    // 开始进行非阻塞IO操作
    char buffer[1024] = { 0 };
    while(1)
    {
        ssize_t sz = read(0, buffer, 1024);
        
        // 如果正常读取
        if(sz > 0)
        {
            buffer[sz - 1] = '\0';    // 设置字符串结束标识
            std::cout << "echo# " << buffer << ", [errno:" << errno << ", errorMsg:" << strerror(errno) << "]" << std::endl;
        }
        else   // 读取失败
        {
            // 如果是因为资源没有就绪而读取失败
            if(errno == EWOULDBLOCK || errno == EAGAIN)
            {
                std::cout << "errno:" << errno << ", errorMsg:" << strerror(errno) << std::endl;
            }
            else if(errno == EINTR)   // 因为进程收到信号而终止read
            {
                std::cout << "Interrupt because of signal, errno:" << errno << ", errorMsg:" << strerror(errno) << std::endl;
            }
            sleep(1);
        }
    }

    return 0;
}